#pragma once

#include <metalc/cls/_cls.h>
/* 来自mimalloc的szcls */

#define wsize_from_size(size)		(((size) + sizeof(word_t) - 1) / sizeof(word_t))

// #define __mi_bin_b(wsize_1)		((wsize_1) == 0 ? WORD_WIDTH : log2_align(wsize_1))
#define __mi_bin_b(wsize_1)		((uint8_t)log2_align((word_t)wsize_1))
#define __mi_bin(wsize_1)		(((__mi_bin_b(wsize_1) << 2) + (((wsize_1) >> (__mi_bin_b(wsize_1) - 2)) & 0x03)) - 3)

#define __sz2cls_mi(size)		(wsize_from_size(size) <= 1 ? 1 : ((wsize_from_size(size) <= 8) ? wsize_from_size(size) : __mi_bin(wsize_from_size(size) - 1)))

/* 这是直接从cache里拿大小? */
#define wsize2size(wsize)		(wsize * sizeof(word_t))

static const size_t cls2sz_tbl_mi[] = {
	wsize2size(1), \
	wsize2size(	 1), wsize2size(	 2), wsize2size(	 3), wsize2size(	 4), wsize2size(	 5), wsize2size(	 6), wsize2size(	 7), wsize2size(	 8), /* 8 */ \
	wsize2size(	10), wsize2size(	12), wsize2size(	14), wsize2size(	16), wsize2size(	20), wsize2size(	24), wsize2size(	28), wsize2size(	32), /* 16 */ \
	wsize2size(	40), wsize2size(	48), wsize2size(	56), wsize2size(	64), wsize2size(	80), wsize2size(	96), wsize2size(	112), wsize2size(	128), /* 24 */ \
	wsize2size(	160), wsize2size(	192), wsize2size(	224), wsize2size(	256), wsize2size(	320), wsize2size(	384), wsize2size(	448), wsize2size(	512), /* 32 */ \
	wsize2size(	640), wsize2size(	768), wsize2size(	896), wsize2size(	1024), wsize2size(	1280), wsize2size(	1536), wsize2size(	1792), wsize2size(	2048), /* 40 */ \
	wsize2size(	2560), wsize2size(	3072), wsize2size(	3584), wsize2size(	4096), wsize2size(	5120), wsize2size(	6144), wsize2size(	7168), wsize2size(	8192), /* 48 */ \
	wsize2size(	10240), wsize2size(	12288), wsize2size(	14336), wsize2size(	16384), wsize2size(	20480), wsize2size(	24576), wsize2size(	28672), wsize2size(	32768),	/*	56	*/	\
	wsize2size(	40960), wsize2size(	49152), wsize2size(	57344), wsize2size(	65536)
	/* ,wsize2size( 81920), wsize2size( 98304), wsize2size(114688), wsize2size(131072), 64 */
	/* wsize2size(163840), wsize2size(196608), wsize2size(229376), wsize2size(262144), wsize2size(327680), wsize2size(393216), wsize2size(458752), wsize2size(524288), 72 */ 
};

#define __cls2sz_mi(cls)		(cls2sz_tbl_mi[cls])

#define __clsnr_mi(bits_max)		(__sz2cls_mi(BIT(bits_max)))



#define DEF_CLS_MI(name, MINSZBIT, MAXSZBIT)			\
DECL_SZLCS(name)						\
SASSERT(MAXSZBIT > MINSZBIT);					\
SASSERT(MINSZBIT == 0);				 \
static const szcls_t _clsnr_##name = __clsnr_mi(MAXSZBIT);\
/* static const size_t _maxsz_##name = __cls2sz_mi(_clsnr_##name); */\
SAI PURE szcls_t _sz2cls_##name (size_t size){ uint8_t bin = __sz2cls_mi(size); /* printf("%lu bin %u\n", size, bin); */ return (szcls_t)bin; };\
SAI PURE size_t _cls2sz_##name (szcls_t cls){ return __cls2sz_mi(cls); };


